package com.cicc.springboot.utile;

import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.converters.ReadConverterContext;
import com.alibaba.excel.converters.WriteConverterContext;
import com.alibaba.excel.enums.CellDataTypeEnum;

import com.alibaba.excel.metadata.data.ReadCellData;
import com.alibaba.excel.metadata.data.WriteCellData;


import java.text.SimpleDateFormat;
import java.util.Date;;

/**
 * 日期格式转换器
 *
 * @ClassName ExcelDataConverter
 * @Description TODO
 * @Author 转轮王
 * @Date 2024/10/8 9:41
 * @Version 1.0
 */

public class ExcelDataConverter implements Converter<Date> {

    // 定义日期格式化器
    private static final SimpleDateFormat FORMATTER = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    /**
     * 指定支持的 Java 类型为 Date
     */
    @Override
    public Class<Date> supportJavaTypeKey() {
        return Date.class;
    }

    /**
     * 指定支持的 Excel 单元格数据类型为字符串类型
     */
    @Override
    public CellDataTypeEnum supportExcelTypeKey() {
        return CellDataTypeEnum.STRING;
    }


    /**
     * 将 Java 中的 Date 对象转换为 Excel 中的字符串
     *
     * @param context 转换上下文
     * @return 格式化后的日期字符串
     * @throws Exception 可能的异常
     */
    @Override
    public WriteCellData<?> convertToExcelData(WriteConverterContext<Date> context) throws Exception {
        Date value = context.getValue();
        if (value == null) {
            return new WriteCellData<>(); // 如果 Date 为 null，返回空单元格数据
        }
        String formattedDate;
        try {
            // 将 Date 格式化为字符串
            formattedDate = FORMATTER.format(value);
        } catch (Exception e) {
            throw new RuntimeException("日期格式化失败: " + value, e);
        }
        return new WriteCellData<>(formattedDate); // 返回格式化后的日期字符串
    }

    @Override
    public Date convertToJavaData(ReadConverterContext<?> context) throws Exception {
        // 获取 Excel 中的单元格数据
        ReadCellData<?> cellData = context.getReadCellData();

        // 判断数据类型是否是字符串类型
        if (cellData.getType() == CellDataTypeEnum.STRING) {
            // 从单元格数据中获取字符串值并解析为 Date
            String dateStr = cellData.getStringValue();
            return FORMATTER.parse(dateStr);
        } else if (cellData.getType() == CellDataTypeEnum.NUMBER) {
            // 如果是数值类型，解析为 Date
            double numericValue = cellData.getNumberValue().doubleValue();
            return new Date((long) ((numericValue - 25569) * 86400 * 1000));
        } else {
            throw new IllegalArgumentException("单元格数据类型不匹配，期望为字符串或数值类型");
        }
    }

}
